:- import set_unify/2 from set_unify.
:- import numbervars/1 from num_vars.
:- import normalize_result/2 from can_mono.

test :- tp, fail.
test :- writeln('=========== Result is ================'), nl, show_facts.

unify_sets([],[]).
unify_sets([A|As],[B|Bs]) :- 
       set_unify(A,B), unify_sets(As,Bs).


%---------------- Transformed program ----------------------

member__1(_141,_143) :- 
        [_119] = _145, [list,_106] = _147, 
        normalize_result([_145,_147],
                          [_141,_143]).
member__1(_215,_217) :- 
        [_191] = _219, [list,_195] = _221, 
        member([_191],[_195]),
        normalize_result([_219,_221],
                         [_215,_217]).
iota__1(_226,_228) :- 
        [_201] = _230, [_205] = _232, 
        iota1([num],[_201],[_205]),
        normalize_result([_230,_232],
                         [_226,_228]).
iota1__1(_149,_151,_153) :- 
        [_129] = _155, [_129] = _157, [list] = _159, 
        normalize_result([_155,_157,_159],
                          [_149,_151,_153]).
iota1__1(_362,_364,_366) :- 
        [_313] = _368, [_332] = _370, [list,_336] = _372, 
        'my is'([_328],[[_313],[num]]),
        iota1([_328],[_332],[_336]),
        normalize_result([_368,_370,_372],
                         [_362,_364,_366]).
dif__1(_197,_199,_201,_203,_205) :- 
        [list] = _207, [_163] = _209, [_167] = _211, [list] = _213, [list] = _215, 
        normalize_result([_207,_209,_211,_213,_215],
                          [_197,_199,_201,_203,_205]).
dif__1(_593,_595,_597,_599,_601) :- 
        [list,_542] = _603, [_546] = _605, [_550] = _607, [list,_554] = _609, [list,_558] = _611, 
        'my is'([_531],[[_546],[_507]]),
        'my is'([_518],[[_550],[_531]]),
        dif([_542],[_546],[_550],[_554],[_558]),
        normalize_result([_603,_605,_607,_609,_611],
                         [_593,_595,_597,_599,_601]).
rev__1(_149,_151,_153) :- 
        [list] = _155, [_133] = _157, [_133] = _159, 
        normalize_result([_155,_157,_159],
                          [_149,_151,_153]).
rev__1(_279,_281,_283) :- 
        [list,_246] = _285, [_227] = _287, [_256] = _289, 
        rev([_246],[list,_227],[_256]),
        normalize_result([_285,_287,_289],
                         [_279,_281,_283]).
mergedelete__1(_149,_151,_153) :- 
        [list] = _155, [_133] = _157, [_133] = _159, 
        normalize_result([_155,_157,_159],
                          [_149,_151,_153]).
mergedelete__1(_279,_281,_283) :- 
        [list,_248] = _285, [list,_252] = _287, [_256] = _289, 
        mergedelete([_248],[_252],[_256]),
        normalize_result([_285,_287,_289],
                         [_279,_281,_283]).
mergedelete__1(_364,_366,_368) :- 
        [list,_84] = _370, [list,_334] = _372, [list,_338] = _374, 
        'my >'([_310],[_319]),
        mergedelete([list,_84],[_334],[_338]),
        normalize_result([_370,_372,_374],
                         [_364,_366,_368]).
check__1(_207,_209,_211,_213,_215) :- 
        [list] = _217, [_173] = _219, [_181] = _221, [_181] = _223, [_185] = _225, 
        normalize_result([_217,_219,_221,_223,_225],
                          [_207,_209,_211,_213,_215]).
check__1(_717,_719,_721,_723,_725) :- 
        [_612] = _727, [_616] = _729, [_642] = _731, [_678] = _733, [_620] = _735, 
        'my ='([_612],[list,_218]),
        dif([_612],[_616],[_620],[_638],[_654]),
        mergedelete([_638],[_642],[_674]),
        rev([_654],[list],[_670]),
        mergedelete([_670],[_674],[_678]),
        normalize_result([_727,_729,_731,_733,_735],
                         [_717,_719,_721,_723,_725]).
pds1__1(_174,_176,_178,_180) :- 
        [list] = _182, [_147] = _184, [list] = _186, [_155] = _188, 
        normalize_result([_182,_184,_186,_188],
                          [_174,_176,_178,_180]).
pds1__1(_544,_546,_548,_550) :- 
        [_480] = _552, [_472] = _554, [list,_508] = _556, [_512] = _558, 
        member([_476],[_480]),
        check([_472],[_476],[_480],[_498],[_512]),
        pds1([_498],[list,_472],[_508],[_512]),
        normalize_result([_552,_554,_556,_558],
                         [_544,_546,_548,_550]).
pds__1(_506,_508) :- 
        [_428] = _510, [list,_474] = _512, 
        'my is'([_478],[[[_428],[[_428],[num]]],[num]]),
        iota([_478],[list,_464]),
        pds1([_464],[list,list],[_474],[_478]),
        normalize_result([_510,_512],
                         [_506,_508]).
pdsbm__1(_225,_227) :- 
        [_197] = _229, [_183] = _231, 
        pds([_197],[list,list,_183]),
        normalize_result([_229,_231],
                         [_225,_227]).

%---------------- Definitions of tabled preds --------------

:- table pdsbm__1/2.
:- table pds__1/2.
:- table pds1__1/4.
:- table check__1/5.
:- table mergedelete__1/3.
:- table rev__1/3.
:- table dif__1/5.
:- table iota1__1/3.
:- table iota__1/2.
:- table member__1/2.

pdsbm(_63,_65) :- 
        pdsbm__1(_67,_69),
        unify_sets([_63,_65], [_67,_69]).
pds(_63,_65) :- 
        pds__1(_67,_69),
        unify_sets([_63,_65], [_67,_69]).
pds1(_63,_65,_67,_69) :- 
        pds1__1(_71,_73,_75,_77),
        unify_sets([_63,_65,_67,_69], [_71,_73,_75,_77]).
check(_63,_65,_67,_69,_71) :- 
        check__1(_73,_75,_77,_79,_81),
        unify_sets([_63,_65,_67,_69,_71], [_73,_75,_77,_79,_81]).
mergedelete(_63,_65,_67) :- 
        mergedelete__1(_69,_71,_73),
        unify_sets([_63,_65,_67], [_69,_71,_73]).
rev(_63,_65,_67) :- 
        rev__1(_69,_71,_73),
        unify_sets([_63,_65,_67], [_69,_71,_73]).
dif(_63,_65,_67,_69,_71) :- 
        dif__1(_73,_75,_77,_79,_81),
        unify_sets([_63,_65,_67,_69,_71], [_73,_75,_77,_79,_81]).
iota1(_63,_65,_67) :- 
        iota1__1(_69,_71,_73),
        unify_sets([_63,_65,_67], [_69,_71,_73]).
iota(_63,_65) :- 
        iota__1(_67,_69),
        unify_sets([_63,_65], [_67,_69]).
member(_63,_65) :- 
        member__1(_67,_69),
        unify_sets([_63,_65], [_67,_69]).

%---------------- Tp ---------------------------------------

tp :- pdsbm__1(_64,_66), fail.
tp :- pds__1(_64,_66), fail.
tp :- pds1__1(_64,_66,_68,_70), fail.
tp :- check__1(_64,_66,_68,_70,_72), fail.
tp :- mergedelete__1(_64,_66,_68), fail.
tp :- rev__1(_64,_66,_68), fail.
tp :- dif__1(_64,_66,_68,_70,_72), fail.
tp :- iota1__1(_64,_66,_68), fail.
tp :- iota__1(_64,_66), fail.
tp :- member__1(_64,_66), fail.
tp.


%---------------- Builtin Preds ----------------------------

'my ='(X1,X2) :- 'my =__1'(Y1,Y2), unify_sets([X1,X2],[Y1,Y2]).
'my \\=='(X1,X2) :- 'my \\==__1'(Y1,Y2), unify_sets([X1,X2],[Y1,Y2]).
'my is'(X1,X2) :- 'my is__1'(Y1,Y2), unify_sets([X1,X2],[Y1,Y2]).
'my <'([num],[num]).
'my >'([num],[num]).
'my >='([num],[num]).
'my =<'([num],[num]).
'my =:='([num],[num]).
'my =\\='([num],[num]).

'my =__1'(X,X).
'my \\==__1'(_,_).
'my is__1'(num,num).


%---------------- Show Result ------------------------------

show_facts :- pdsbm__1(_63,_65),
              numbervars([_63,_65]),
              write(pdsbm(_63,_65)), nl, fail.
show_facts :- pds__1(_63,_65),
              numbervars([_63,_65]),
              write(pds(_63,_65)), nl, fail.
show_facts :- pds1__1(_63,_65,_67,_69),
              numbervars([_63,_65,_67,_69]),
              write(pds1(_63,_65,_67,_69)), nl, fail.
show_facts :- check__1(_63,_65,_67,_69,_71),
              numbervars([_63,_65,_67,_69,_71]),
              write(check(_63,_65,_67,_69,_71)), nl, fail.
show_facts :- mergedelete__1(_63,_65,_67),
              numbervars([_63,_65,_67]),
              write(mergedelete(_63,_65,_67)), nl, fail.
show_facts :- rev__1(_63,_65,_67),
              numbervars([_63,_65,_67]),
              write(rev(_63,_65,_67)), nl, fail.
show_facts :- dif__1(_63,_65,_67,_69,_71),
              numbervars([_63,_65,_67,_69,_71]),
              write(dif(_63,_65,_67,_69,_71)), nl, fail.
show_facts :- iota1__1(_63,_65,_67),
              numbervars([_63,_65,_67]),
              write(iota1(_63,_65,_67)), nl, fail.
show_facts :- iota__1(_63,_65),
              numbervars([_63,_65]),
              write(iota(_63,_65)), nl, fail.
show_facts :- member__1(_63,_65),
              numbervars([_63,_65]),
              write(member(_63,_65)), nl, fail.
show_facts.
